//
//  StatusDAL.swift
//  weiboLQ
//
//  Created by 半缘君 on 15/12/23.
//  Copyright © 2015年 banyuanjun.cn. All rights reserved.
//

import Foundation

let bdName = "readme.db"

let maxCacheDateTime:NSTimeInterval = 60//7 * 24 * 60 * 60

class StatusDAL {
/// 单例
    static let shareStatusDAL:StatusDAL = StatusDAL()
    //懒创建数据库
    lazy var SQLiteM:SQLiteManager = SQLiteManager.sharedManager
    
    /// 清理`早于过期日期`的缓存数据
    class func clearDataCache() {
        
        // 1. 准备日期
        let date = NSDate(timeIntervalSinceNow: -maxCacheDateTime)
        
        // 日期格式转换
        let df = NSDateFormatter()
        // 指定区域 - 在模拟器不需要，但是真机一定需要
        df.locale = NSLocale(localeIdentifier: "en")
        // 指定日期格式
        df.dateFormat = "yyyy-MM-dd HH:mm:ss"
        // 获取日期结果
        let dateStr = df.stringFromDate(date)
        
        // 2. 执行 SQL
        // 提示：开发调试 删除 SQL 的时候，一定先写 `SELECT *`，确认无误之后，再替换成 `DELETE`
        let sql = "DELETE FROM T_Status WHERE createTime < ?;"
        
        SQLiteManager.sharedManager.queue.inDatabase { (db) -> Void in
            if db.executeUpdate(sql, dateStr) {
                print("删除了 \(db.changes()) 条缓存数据")
            }
        }
    }
    
/// 加载微博数据
     func loadStatus(since_id: Int, max_id: Int, finished: (array: [[String: AnyObject]]?)->()) {
    /// 查询本地数据库缓存
    let array = StatusDAL.checkCache(since_id, max_id: max_id)
        ///如果存在,加载数据
        if array?.count > 0 {
            print("查询到缓存数据 \(array!.count)")
            
            // 回调返回本地缓存数据
            finished(array: array!)
            return
        }
        
        ///如果不存在,从网络加载数据
        print("加载网络数据")
        // 3. 如果没有，加载网络数据
        NetworkTools.shareNetworkTools.loadStatus(since_ID: since_id, max_id: max_id) { (result, error) -> () in
            if error != nil {
                print("出错了")
                
                finished(array: nil)
                return
            }
            
            // 判断 result 的数据结构是否正确
            guard let array = result?["statuses"] as? [[String: AnyObject]] else {
                print("数据格式错误")
                
                finished(array: nil)
                return
            }

        ///缓存到本地数据库
            StatusDAL.saveCacheToDb(array)
            // 5. 通过闭包返回网络数据
            finished(array: array)
    }
    }
    
    private class func checkCache (since_id: Int, max_id: Int) -> [[String: AnyObject]]? {
//        print("检查本地数据 \(since_id) \(max_id)")
        
        // 0. 用户 id
        guard let userId = UserAccountViewModel.shareAccountModel.account?.uid else {
            print("用户没有登录")
            return nil
        }
        
        // 1. 准备 SQL
        var sql = "SELECT statusId, status, userId FROM T_Status \n"
        sql += "WHERE userId = \(userId) \n"
        
        if since_id > 0 {           // 下拉刷新
            sql += "    AND statusId > \(since_id) \n"
        } else if max_id > 0 {      // 上拉刷新
            sql += "    AND statusId < \(max_id) \n"
        }
        
        sql += "ORDER BY statusId DESC LIMIT 20;"
        
        print("查询数据 SQL -> " + sql)
        
        // 2. 执行 SQL -> 返回结果集合
        let array = SQLiteManager.sharedManager.execRecordSet(sql)
        
        // 3. 遍历数组 -> dict["status"] JSON 反序列化
        var arrayM = [[String: AnyObject]]()
        for dict in array {
            let jsonData = dict["status"] as! NSData
            // 反序列化 -> 一条完整微博数据字典
            let result = try! NSJSONSerialization.JSONObjectWithData(jsonData, options: [])
            
            // 添加到数组
            arrayM.append(result as! [String : AnyObject])
        }
        
        // 返回结果 － 如果没有查询到数据，会返回一个空的数组
        return arrayM

    }
    
/// 缓存到本地数据库
    private class func saveCacheToDb (arr:[[String:AnyObject]]) {
//        print(arr)
/**
        保存数据是:
        
        1,statusID 微博的ID 主键 ,不要自增长 ,需要default时间
        2,微博内容 text
        3,user  id
        
        
        */
        
        ///准备SQL
        let sql = "INSERT OR REPLACE INTO T_Status (statusId, status, userId) VALUES (?, ?, ?);"
        /// userID
        guard let userId = UserAccountViewModel.shareAccountModel.account?.uid else {
            return
        }
//        print(id)
        SQLiteManager.sharedManager.queue.inTransaction { (db, rollback) -> Void in
            
            for dict in arr {
                /// statusId
                let statusID = dict["id"] as! Int
                //            print(statusID)
                let jsonData = try! NSJSONSerialization.dataWithJSONObject(dict, options: [])
//                print(jsonData)
                if !db.executeUpdate(sql, statusID, jsonData, userId) {
                    print("插入数据失败")
                    // 回滚
                    rollback.memory = true
                    // break
                    break
                }
                
            }
             print("数据插入完成！")
        }
    }
    
    
}